你一定不知道的 AppStore 秘密
↓推荐关注↓
一、前言
对于 iOS 开发者来说 App Store 是必经之路,大家一定多多少少都会有了解。但 App Store 的功能之多,并且每年都有更新,比如上一篇文章我们讲到 《解读 AppStore 新功能:自定义产品页面和 A/B Test 工具》,所以本文对一些大家平时经常接触的功能,但可能忽视的一些细节进行解说,也会对一些平时大家很少接触的功能进行探索。可能不是最全的,但一定有你不知道的 App Store 秘密!
二、AppStore 秘密
我们的 SDK 包含 250,000 个 API,为您在 app 中构建高级功能提供了无限的可能性。过去 4 年发布的 iPhone 设备中 92% 都在运行 iOS 13,因此您可以放心地利用最新技术来交付功能。
来源:App Store \- Apple Developer[1]
1 个生态系统。 5 个平台。 40 种语言。 175 个地区。 每周 5 亿访客。 15 亿台 Apple 设备。
关于苹果 App Store 服务,大家最熟悉的包含有 App Store app、IAP(In App Purchase,应用内购买)、App 预订、App 评论搜索等。那么,我们一起来看看,有那些不为大家所知的秘密吧~
2.1 系统状态
比如上周五,苹果 App Store 出现故障,导致 无法连接 App Store
,用户无法打开的问题:
针对以上这个情况,有没有办法可以提前预测呢?很遗憾告诉大家,目前苹果官方还没有提供实时的系统服务状态查询,在苹果官网的帮助可以查看到这样的 系统状态页面[2]:
从上图可以看到,Apple Books
和 iTunes Store
服务在 2016-04-26 时因一些不可抗拒的原因在中国内地中断至今。而 Apple Pay & Wallet
钱包功能出现服务中断:
2021-07-23 上午7:00 - 现在,部分用户受到影响,岭南通·羊城通的持卡人可能无法使用 Apple Pay 的部分功能。
从这个服务中断就可以看出来,苹果的这个系统状态通知,并不是实时的公告,而是有延迟,有时候是修复后才出通知公告。
关于系统状态页面,不同地区是不同的链接,小编整理常见的列表:
国家/地区 | 语言代号 | 链接 |
---|---|---|
中国 | zh_CN | www.apple.com/cn/support/…[3] |
美国 | en_US | www.apple.com/support/sys…[4] |
中国香港 | zh_HK | www.apple.com/hk/support/…[5] |
中国台湾 | zh_TW | www.apple.com/tw/support/…[6] |
韩国 | ko_KR | www.apple.com/kr/support/…[7] |
日本 | ja_JP | www.apple.com/jp/support/…[8] |
新加坡 | en_SG | www.apple.com/sg/support/…[9] |
俄罗斯 | ru_RU | www.apple.com/ru/support/…[10] |
德国 | de_DE | www.apple.com/de/support/…[11] |
从这里可以看到,每个国家或地区的链接中代码,那么这个语言代号可以从苹果 Choose Your Country or Region[12] 网页的源代码中获取,这也是苹果目前支持的国家和地区。
以上是针对用户层面的服务,比如 App Store、iCloud 是否可用等,那么针对开发者来说,有没有苹果服务 API 的系统状态呢?其实也是有的。
开发者系统状态
从这个图片可出来,针对 App Store 的服务有很多,App Store Connect
、App Store Sandbox
、App Store Server Notifications
、In-App Purchases
、App Store Receipt Verification
等,从而可以看出这个页面的信息非常的重要!当然,这个目前苹果官方也没有实现的通知。比如这个:
Resolved Outage(已解决的中断) Today, 12:58 AM - 1:07 AM Some users were affected Affected Services: App Store Connect, App Store Connect API, TestFlight Users experienced a problem with this service.
因为这些服务目前是针对开发者服务,目前还没有分国家或地区的服务器,统一用这个 developer.apple.com/system-stat…[13] 页面查看开发者系统状态。一般来说,当出现大面积的无法使用的服务时,可以通过查看状态确认是不是苹果服务器问题。
比如,经常遇到苹果沙盒环境无法充值(App Store Sandbox
)、线上用户无法充值(In-App Purchases
、App Store Receipt Verification
),只能说,遇到问题时怀疑是苹果的服务问题,可以看看这个页面。但这个页面也不时实时刷新,出现大面积的无法使用,依然是看看大家(同行)或者新闻的消息。
注:为什么没有实时,我想是目前苹果的服务遍布全球,想要全盘实时通知,一方面是影响的时长,另一方面影响的范围,不是不可以,可能是需要时间?可以肯定苹果有内部系统报警,但如果遇到问题,马上通知开发者?评估影响时长和范围?还是应该马上修复?这里就不深入探讨,看看苹果未完待续。
既然苹果这样,那么我们来对比一下谷歌,看看有没有不一样的发现?首先是 Google 产品和服务的流量和中断记录页面会显示:
可以看到谷歌服务的中断情况,网页中还有按国家、地区的筛选条件,这里就不展开了,大家想了解可以看看啊。
而谷歌常见服务出现故障甚至宕机时,在 Google Workspace 状态信息中心[14] 页面可以查看:
页面底部有一个入口,Google Workspace 历史记录[15] 可以查看某个服务的中断时间,影响时长等。相对于苹果的服务来说,还提供 RSS 和 JSON 历史记录接口,甚至是 帮助文档[16],显得更加完善和友好:
谷歌的系统状态查看服务有:Google Workspace[17]、Google Cloud Status Dashboard[18]、Firebase Status Dashboard[19]、Google Ads[20] 等,页面风格统一。Google Play Store 的系统状态,小编没有找到入口;而谷歌系统状态信息的实时性暂时没有相关资料,有懂的朋友,可以在评论区一起交流哈~
从网上资料看,谷歌服务出现故障的情况好像不多,毕业谷歌有商业化的云服务,出故障是不可能的?而苹果,一般是服微软和亚马逊的云服务,而在中国的 iCloud 服务是用云上贵州,其它的服务暂时还是统一服务器?
当然,关于实时性,也有第三方的服务监听苹果和谷歌的服务。比如 Downdetector[21]、Google Play not working\?[22] 、Google Workspace Status[23] 。这里就不展开了,毕竟第三方也是监听,从最优方案当然是官方支持。
最后,一般做用户产品的 app 都会遇到用户反馈:如果您无法连接到 App Store、iTunes Store 或其他 Apple 服务[24],但是文档是发生问题后的解决方案,能不能优化一下减少出问题呢?关于服务系统状态查询,它的目的是什么?肯定不是出问题后,给大家通告一下就完事吧,而应该是向更高实时性提高!加油吧苹果!
2.2 App 订阅
苹果内购订阅是很常见的类型,比如音乐、视频类 app 的持续包月,以前可能用户在 app 里订阅后,以为是一次性或者想准备到期后在取消,然后就被自动扣费了。这一招现在支付宝和微信早就学会了。还有一个原因,是以前苹果的 App Store 账号管理在首页下滚到最底部,总之经过的步骤很复杂,一般小白用户很难找。
其实,关于管理 app 订阅,以前是可能通过 https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/manageSubscriptions
链接打开 App Store 会自动显示用户的订阅信息界面,但一般开发者不会提供,甚至是开发者都不知道有这个链接。
现在,最新的 iOS 14 以后,App Store 用户账号很方便找到入口,在“帐户”,然后轻按“订阅”就可以管理订阅了。当然,如果开发者愿意引导用户打开订阅管理界面,可以用最新的这个苹果链接 https://apple.co/2Th4vqI
。更多关于取消订阅可以参考 如何取消 Apple 提供的订阅[25] 文档。
最后,苹果在 WWDC21 推出了在 app 里管理用户订阅项目的界面,不用在跳转到 App Store,具体可以翻看之前的文章 苹果内购 \- WWDC21[26]。
2.3 App 链接
在 2019 年以前,苹果的 app 商店链接,一直都是 itunes.apple.com
,举例来说是这样的:https://itunes.apple.com/cn/app/斗罗大陆-魂师对决/id1558453472
。因为 iTuens
是苹果的音乐播放和管理的软件,iPhone 可以说是从 iPod 升级而来,关于 iTuens 这里就不多说,因为苹果已经弃用并且,并转移到 Apple Music 和 Apple 播客这两个 app 中,详细可以查看 iTunes \- Apple[27]。
2019年6月14号,苹果宣布[28] AppStore 商店App下载地址从 itunes.apple.com
更换为 apps.apple.com
。比如用 https://itunes.apple.com/cn/app/斗罗大陆-魂师对决/id1558453472
请求时,会自动跳转到 https://apps.apple.com/cn/app/斗罗大陆-魂师对决/id1558453472
。所以大家建议用新的链接,减少页面跳转。
当然,这个链接里有一个 cn
这个是国家或地区的标识,这个标识跟前文提到的是一样的。如果你的应用只上中国内地,那么就用 cn,用其它的也不影响中国内地账号用户访问,而其它地区的用户账号访问时会提示:目前您所在国家或地区尚不提供此App。而如果是选择全球所有的地区都发布,那么用什么地区标识都可以打开。
更进一步,不带地区也是可以,比如:https://apps.apple.com/app/斗罗大陆-魂师对决/id1558453472
,甚至带游戏名也不用带 https://apps.apple.com/app/id1558453472
。不带这些参数的话,用电脑上打开显示 Connecting to the iTunes Store...,但是可以正常跳转到 App Store:
带所有的参数时,会显示 App Store 预览页面:
所以,关于 App 链接,最好的链接格式,应该是这样:https://apps.apple.com/cn/app/id1558453472
。带有地区和 apple id 标识就可以了,游戏名可以不需要带上。
App Store 开发者页面
那么有一个问题,app 可以通过链接跳转到 App Store,那么可能通过链接跳转到 App Store 的开发者界面吗?
很显然是可以的!比如这个链接:https://apps.apple.com/cn/developer/khorgas-zhifan-network-technology-co-ltd/id1540746184
,需要注意这个 id1540746184
是开发者账号的id,不是 app 的。那么问题来了,怎么获取这个开发者页面的链接呢?
答案就是,在浏览器打开开发者的某个 app 的预览页面,然后开发者名字那一栏,就是开发者页面的链接,复制一下就可以啦~
2.4 App 评论
在所有的 iOS 版本中,通过 app 链接拼接 action=write-review
时,都可以跳转到 App Store 打开评估页面。比如 https://apps.apple.com/cn/app/id1558453472?action=write-review
。需要注意的是,如果用户从来没有下载过此 app,则跳转后会提示必须拥有此项目才能评论:
而在 iOS 10.3 以上,苹果提供了 app 内评论的功能,方法也很简单,调用苹果的 API 接口 [SKStoreReviewController requestReview]
就可以:
App内评分功能注意事项
仅支持 iOS 10.3+ 以上 评分弹窗是标准化,不提供自定义UI或控制评分功能 开发环境每次调用都会显示评分界面 TestFlight 环境不会显示评分界面 生产环境一个用户账号最多显示3次/365天 生产环境如果已经评论成功,再调用不会再弹
很多开发者如果不太留意,看到上面的弹窗,会以为只能在 App Store 才能文字评论。其实,在 app 内也可以写评论,在星级评论提交后,会显示下面的界面:
用户还可以选择,要不要撰写评论。当然点击”好“表示不写文字评论了。
app 评分数量太少,可能会降低用户下载 app 的意愿,所以,苹果提高了这样的接口给开发者来选择。那么对于开发者来说,可以得到更多用户评论的机会,但如果不转移到 App Store 评论,就减少了 app 的曝光量。当然,好的 app 会消除了用户的顾虑,但酒香也怕巷子深,需要开发者多维度思考。
最后,从用户角度来看,如果你觉得 app 内评论影响到你的使用体验,其实你是可以在设置里关闭的:
在设置的 App Store 子页面中,可以选择关闭。所以,苹果的产品,确实会更多的站在用户体验来思考,不仅仅是(不)满足开发者。
2.5 iTunes Store API
苹果提供了一套 API 给开发者用来获取 iTunes Store、App Store、iBooks Store 和Mac App Store 的内容信息,包括 App、iBooks、电影、播客、音乐、音乐视频、有声读物和电视节目等。
比如获取 app 的最新信息,请求 https://itunes.apple.com/cn/lookup?id=1558453472
可以获取到:
{
"resultCount": 1,
"results": [
{
"advisories": [
"偶尔/轻微的卡通或幻想暴力", "偶尔/轻微的现实暴力"
],
"appletvScreenshotUrls": [
],
"artistId": 1540746184,
"artistName": "Khorgas Zhifan Network Technology Co., Ltd.",
"artistViewUrl": "https://apps.apple.com/cn/developer/khorgas-zhifan-network-technology-co-ltd/id1540746184?uo=4",
"artworkUrl100": ".../100x100bb.jpg",
"artworkUrl512": "https://is2-ssl.mzstatic.com/image/thumb/Purple115/v4/67/ac/7e/67ac7e2b-765c-ac94-9a60-215e975312e4/source/512x512bb.jpg",
"artworkUrl60": ".../60x60bb.jpg",
"averageUserRating": 4.5312200000000002475530891388189047574,
"averageUserRatingForCurrentVersion": 4.5312200000000002475530891388189047574,
"bundleId": "com.khorgas.hsdj",
"contentAdvisoryRating": "12+",
"currency": "CNY",
"currentVersionReleaseDate": "2021-07-20T15:01:04Z",
"description": "———2亿魂师推荐,真3D战斗手游———
21年度国民级IP战斗手游巨作,由阅文集团和腾讯动画正版授权,2亿用户推荐,和动画一模一样的《斗罗大陆:魂师对决》7月22日正式公测!下载与万千魂师即刻对决!
...
...
",
"features": [
"iosUniversal"
],
"fileSizeBytes": "1441496064",
"formattedPrice": "免费",
"genreIds": [
"6014", "7014", "7017"
],
"genres": [
"游戏",
"角色扮演",
"策略"
],
"ipadScreenshotUrls": [
"https://is4-ssl.mzstatic.com/image/thumb/PurpleSource125/v4/33/6f/ee/336fee4b-ced2-a41c-7e53-45ab6ad8e446/86ac5fcd-ba9d-41ee-8a20-63899b6b7697_2732x2048-1.jpg/552x414bb.jpg",
...
],
"isGameCenterEnabled": false,
"isVppDeviceBasedLicensingEnabled": true,
"kind": "software",
"languageCodesISO2A": [
"ZH"
],
"minimumOsVersion": "10.0",
"price": 0.0,
"primaryGenreId": 6014,
"primaryGenreName": "Games",
"releaseDate": "2021-07-20T07:00:00Z",
"releaseNotes": "1.斗罗大世界全新打造,真实天气交互,沉浸式的斗罗大陆,还每个斗罗迷一个真斗罗!
2.随机融合技玩法,觉醒你的专属武魂,深度培养,自由成长变异,挑战斗罗大陆最强的魂技策略组合!
3.其他优化:引擎、兼容性、画面等全面优化,提升游戏最佳体验!",
"screenshotUrls": [
"https://is3-ssl.mzstatic.com/image/thumb/PurpleSource125/v4/65/7c/25/657c25a0-3fc7-cab5-b3f3-e46f8ece74d4/440d205f-827a-4446-9b28-2dcce8bef01e_2208x1242-1.jpg/406x228bb.jpg",
...
],
"sellerName": "Khorgas Zhifan Network Technology Co., Ltd.",
"supportedDevices": [
...
],
"trackCensoredName": "斗罗大陆:魂师对决-腾讯动画正版授权",
"trackContentRating": "12+",
"trackId": 1558453472,
"trackName": "斗罗大陆:魂师对决-腾讯动画正版授权",
"trackViewUrl": "https://apps.apple.com/cn/app/%E6%96%97%E7%BD%97%E5%A4%A7%E9%99%86-%E9%AD%82%E5%B8%88%E5%AF%B9%E5%86%B3-%E8%85%BE%E8%AE%AF%E5%8A%A8%E7%94%BB%E6%AD%A3%E7%89%88%E6%8E%88%E6%9D%83/id1558453472?uo=4",
"userRatingCount": 44061,
"userRatingCountForCurrentVersion": 44061,
"version": "2.0.2",
"wrapperType": "software"
}
]
}
详细的内容字段,这里就不解析了,看就明白了。对于开发者来说,很方便通过苹果这个链接的数据获取一些信息,比如 app 的图标 artworkUrl512
字段获取,或者是 app 的版本号,可以通过这个信息来判断是否有新版本等。
根据小编经验,一般发布一个新版本后,大概 15 分钟这样,这个链接的数据才会更新,并且这个链接的数据更新后,App Store 才会显示可更新的版本。所以,对于发布新版本对外后,app 何时生效,通过监听这个链接的变动,目前是一个高效的方式,毕竟 app 发布后苹果只保证 24 小时内生效。
因为我们国内用苹果音乐、视频 TV 等比较少,所以这里就不介绍了,详细可以参考:iTunes Search API[29] 和 iTunes Store API[30] 文档。
2.6 App 下载
对于游戏来说,包体一般都是在 1 GB 以上,AppStore 使用蜂窝移动下载的应用包最大多少MB呢?
2017年9月,蜂窝流量下载限制从 100M
扩大到150M
2019年5月下旬, 蜂窝流量下载限制从 150M
扩大到200M
2019年9月,iOS 13 正式版发布,可以选择使用蜂窝网络下载(不限制大小)。
所以,低于 iOS 13 的设备,可以使用蜂窝网络下载大小不超过 200 MB
的 App,否则,只能通过 WiFi(手机开热点也可以。)。
对于 iOS 13 以上,如果下载超过 200MB 的应用时,会提示链接 WiFi 时再下载 或 直接使用蜂窝网络下载:
选项可以在设置中更改,请前往“设置” -> “App Store” -> “App下载”:
如上图,在 iOS 13+ 有三个可选项:
始终允许 超过 200 MB 时请求许可 始终询问
所以,2019年9月后,蜂窝流量下载的限制应该是算没有了,苹果不在通过 AppStore 强制来控制,而是把选择权交回给用户。对于开发者来说,这也是一个好消息。
2.7 App 预订
App 预订功能大家应该都有了解过,那么你知道以下几个问题的答案吗?
预订后的发布时间对应北京时间是几点? 用户预订 app 后能取消预订吗? app 上线后怎么区分那些用户是预订过的? app 能像谷歌一样给预订的用户发奖励吗?
App 预订功能为什么这么多问题,原因有几个方面,一是开启 App 预订的前提条件有 2 个:
app 未曾上架商店 app 过审已经通过,等待开发者发布
这 2 个条件已经难道一批开发者,最重要的是测试环境!苹果没有提供 App 预订的测试环境!或者测试的方案!完成让你在生产环境上搞,所以,第一次吃螃蟹的人都是勇(辣)敢(鸡)的战(苹)士(果)!
预订后的发布时间对应北京时间是几点? 这个问题,所有有预订 app 的开发者可能会有这样的疑问。从苹果官方文档中,目前获取不到答案。从经验来说,一般是北京时间 23 点时默认预定发布;当然,开发者可以在苹果后台手动选择马上发布,而跳过系统自动定时发布。那么这个预订发布时间到底是什么时间呢?
假设预订时间是:2020-10-16
那么真实预订生效时间:2020-10-15 北京时间 22:00 生效(或 23:00 生效)
首先,我们想到的是从苹果后台网页的源码查找:
上图的时间戳 1551168000000(毫秒) 转成北京时间为 2019-02-26 16:00:00 。显然不符合预期时间,所以,到底是什么时间?
最后在从苹果的 iTunes Search API
接口获取到 app 的信息(小编注:此接口下文会详细讲解,此处先略过。),接口返回的 Json 数据里有一个字段 releaseDate
,大概的内容是这样 "releaseDate": "2021-09-23T07:00:00Z"
(预订发布时间是2021年9月23日推出。)。刚开始小编也认为这个时间是 UTC/GMT 时间,最近根据北京时间 22:00 生效(或 23:00 生效)节点,推测苹果的 releaseDate 字段的时间是太平洋时间。那么太平洋时间是什么呢?
从维基百科 太平洋时区[31] 查看:
太平洋时区(Pacific Time Zone)是在美国、加拿大及墨西哥西海岸靠近太平洋地区使用的时区。
太平洋时区:也被称为太平洋时间(Pacific Time, PT
)。其标准时间(冬季)称为太平洋标准时间(Pacific Standard Time, PST
),UTC-8;夏令时间(夏季)称为太平洋夏令时间(Pacific Daylight Time, PDT
),UTC-7。
这里可以直接看截图:
这是小编之前在公司内部分享《游戏出海本地化概述》的PPT(预告:下一篇文章会整理分享给大家。)
简单来说,中国标准时间(CST)比世界协调时间(UTC)早 8 小时,而太平洋夏令时间(PDT)比世界协调时间(UTC)晚 7 小时,也就是太平洋夏令时间(PDT)比中国标准时间(CST)晚 15 小时。
所以,太平洋夏令时间 7:00 (7:00 AM) = 北京时间 22:00 (10:00 PM) 。时间是对上了,但是日期没有对上!"releaseDate": "2021-09-23T07:00:00Z"
,所以这个至今还是一个迷,小编猜想苹果的服务器时间可能历史原因,还是用太平洋时间为基准,比如每年圣诞节暂时审核的时间也是太平洋时间。所以,这个问题有知道的朋友,可以在评论区一起讨论哈~
最后,关于 GMT/UTC/PST 这些时间,夏令时中国也实行过,本文就暂不深入展开,有时候会在单独梳理一篇关于时间的文章,敬请大家期待哈~
1986年至1991年,中华人民共和国在全国范围实行了六年夏令时,每年从4月中旬的第一个星期日2时整(北京时间)到9月中旬第一个星期日的凌晨2时整(北京夏令时)。除1986年因是实行夏令时的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。夏令时实施期间,将时间向后调快一小时。1992年4月5日后不再实行。
用户预订 app 后能取消预订吗?
答案是肯定可以啊。具体可以在 App Store app 的账户设置里进行取消:
其它方式可以参考 官方文档[32],另外,如果应用是付费下载的方式,那么预订时并不会马上收取费用,在应用发布后,系统会从你的付款方式中收取费用,并且会发一封电子邮件通知你。(注:如果付费应用,在预订期间调整 App 的价格,则会在顾客接受预订的价格和发布当日的价格中,选择较低的价格向顾客收取。)
而预订的用户,在应用发布后,系统是否会自动下载到用户的设备上?如果该用户 启用自动下载[33],则该 App 也会下载至该用户的所有其他设备上。启用自动下载的开关如下图:
app 上线后怎么区分那些用户是预订过的?
曾经一度认为苹果的没有标识预订用户的接口,然后在苹果 营销您的 App[34] 页面的最下面看到一段不起眼的话:
您可以通过收据中的 “preorder\_date \(英文\)[35]” (预订日期) 字段来识别已预订您 app 的顾客。您可以使用此信息为预订用户解锁奖励 (如额外的游戏币),或在 app 内显示感谢购买的信息。
根据苹果的文档 responseBody.Receipt[36],苹果提供了三个用户预约 app 时间的字段(三个不同时间格式):
字段 | 作用(英文) | 作用(中文) |
---|---|---|
preorder_date | The time the user ordered the app available for pre-order, in a date-time format similar to ISO 8601. | 用户订购可用于预订的 app 的时间,采用类似于 ISO 8601 的日期时间格式。 |
preorder_date_ms | The time the user ordered the app available for pre-order, in UNIX epoch time format, in milliseconds. This field is only present if the user pre-orders the app. Use this time format for processing dates. | 用户订购可用于预购的 app 的时间,以 UNIX 纪元时间格式,以毫秒为单位。此字段仅在用户预订应用程序时出现。使用此时间格式处理日期。 |
preorder_date_pst | The time the user ordered the app available for pre-order, in the Pacific Time zone. | 用户在太平洋时区订购可供预订的 app 的时间。 |
如果大家熟悉 receipt data,那么肯定会有这样的疑问?通过内购的收据查用户预订状态???对的!从目前的苹果 API 来看,还没有一个针对用户 App Store 信息的库或者一套 API,所以可能苹果工程师从简单的角度来看,预订的数据是 App Store 的数据,而 App Store 的内购又是一套通用的 API,所以直接放在 receipt 里面 ??!!
一切都是这么的(不)合理!为了拿到用户的预订时间,而这么复杂化的流程,并且 receipt 数据比较大,所以,苹果工程师估计也是知道的,所以在 WWDC21 推出了 StoreKit 2,但苹果并没有针对预订状态查询提供新的接口,具体可以翻看之前的文章 苹果内购 \- WWDC21[37]。
说了这么多,那么开始说点技术的内容啊,首先是获取苹果 Receipt 收据的接口:
NSString *receiptString = [[NSString alloc] initWithData:[[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]] base64EncodedDataWithOptions:0] encoding:NSUTF8StringEncoding];
那么问题来了,这个获取的数据,在沙盒环境下,并没有 preorder_date
字段,因为在测试环境下,app 无法模拟预订的过程,所以辣鸡!这时候就是脑洞大开的时间了,那就下载一些之前预订的 app,获取它的 Receipt 数据,看看 preorder_date
的时间就好啦!(还好 App Store 有很多预订中的 app,所以大家用户自己开发一个新 app 然后送审,在然后预订下载,不然这样一个流程下来,估计已经花一个月以上了!)
通过越狱设备,下载预订的 app,然后 Cycript
命令工具,执行 cycript \-p 进程名
或者 cycript \-p 进程ID
,然后执行下面的代码,就可以得到 Receipt 数据:
[[NSString alloc] initWithData:[[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]] base64EncodedDataWithOptions:0] encoding:NSUTF8StringEncoding]
注:Cycript 由 Cydia 创始人 Saurik 推出的一款脚本语言,它混合了 Objective-C 与 JavaScript 语法解释器,能够探测和修改运行中的应用程序。Cycript 主要用于注入目标进程来实现运行时调试,它的优点是重启程序后所有的修改都会失效,对原生程序或代码完全无副作用。关于越狱更多知识,大家自行查阅相关资料啊,这里也不展开了。
最后,把获取到的 Receipt 数据,通过苹果的 verifyReceipt[38] 接口验证,获取到收据的内容:
{
environment = Production;
receipt = {
"adam_id" = 1558453472;
"app_item_id" = 1558453472;
"application_version" = 14;
"bundle_id" = "com.khorgas.hsdj";
"download_id" = 111070588400817;
"in_app" = (
);
"original_application_version" = 14;
"original_purchase_date" = "2021-07-20 15:39:32 Etc/GMT";
"original_purchase_date_ms" = 1626795572000;
"original_purchase_date_pst" = "2021-07-20 08:39:32 America/Los_Angeles";
"preorder_date" = "2021-05-03 03:34:56 Etc/GMT";
"preorder_date_ms" = 1620012896000;
"preorder_date_pst" = "2021-05-02 20:34:56 America/Los_Angeles";
"receipt_creation_date" = "2021-08-02 02:32:58 Etc/GMT";
"receipt_creation_date_ms" = 1627871578000;
"receipt_creation_date_pst" = "2021-08-01 19:32:58 America/Los_Angeles";
"receipt_type" = Production;
"request_date" = "2021-08-02 07:18:50 Etc/GMT";
"request_date_ms" = 1627888730021;
"request_date_pst" = "2021-08-02 00:18:50 America/Los_Angeles";
"version_external_identifier" = 843086210;
};
status = 0;
}
那么就可以获取到预订的时间:
"original_purchase_date" = "2021-07-20 15:39:32 Etc/GMT"; "original_purchase_date_ms" = 1626795572000; "original_purchase_date_pst" = "2021-07-20 08:39:32 America/Los_Angeles";
综上,这就是判断一个用户是否为预订用户的方法,是不是感觉绕了一圈子!这也是目前唯一的方法了。另外,如果没有 preorder_date
字段,那么这个用户就是非预订用户,是在预订时间后才下载应用的。
app 能像谷歌一样给预订的用户发奖励吗?
像游戏,一般会给预订的用户,在开服当天发送奖励,那么实现这个预订的用户发放奖励,流程是怎么样?
先说一下 Google Play Store,从 为应用开放预注册服务以提升用户认知度[39] 文档可以看到,开发者可选择提供预注册奖励,只需要在 Play 后台设置状态的商品(内购品项)。整个预订的用户判断和发奖流程,都是谷歌统一来处理和管理,不需要开发者操心!
正如我们上一篇文章说的 解读 AppStore 新功能:自定义产品页面和 A/B Test 工具,Apple & Google、iOS & Android、App Store & Play Store,相互学习相互借鉴,至少目前来说,苹果苹果需要向谷歌学习的地方确实还有很好!加油苹果~
那么 iOS 怎么给预订的用户发送奖励呢?从上面的流程,大家可能已经感受到了。用户是否为预约用户,要先从用户下载的 app 里调用苹果接口获取 Receipt 收据,发送给服务端向苹果验证这个收据,响应的收据信息里,有 preorder_date 字段,判断用户预约的时间,然后就可以判断用户发放奖励等处理逻辑。
详细的发奖励流程,这里就不详细展开了,但这里需要注意一点是防止用户恶意刷取,因为刚刚说了,有没有这个字段是跟用户的 apple id 账号关联的,而一个 apple id 账号是可以登陆多个设备的。可以感受到,苹果的这个预订奖励功能有多烂,没有对比就没有伤害。谷歌的预订奖励是谷歌服务来控制,谷歌可以控制一个谷歌Play用户只能领取一次!
其它的坑点
苹果新后台刚刚改版时,出现了很多问题,其中一个就是预订时间无法更改的Bug,导致了想延迟预订时间都没有办法。不得不吐槽一下苹果,当出现 bug 时,一般是通过邮件或者电话联系开发者当地的客服,而一般开发者反馈的问题都不会得到重视,导致了一些问题让开发者很煎熬!
遇到这种问题时,只能默默选择下架应用,那么下架后,担心已经预订的用户是不是收到下载通知?苹果的文档[40] 有解析:如果您将 App 预订从 App Store 中移除,除非在发布日期之前您再次使其支持预订,否则已经预订了您 App 的顾客将不会收到该 App,且不会向顾客收取费用。此外,一旦发布日期已过,您便不能再次将 App 以预订形式发布。
最后一个问题就是,预订状态的生效时间。用户预订应用后,App Store 会显示灰色的 已预订
按钮,无法点击:
然而,有一些用户就是没有开启自动下载功能,这时候,其实用户是不会自动下载的。然后因为苹果服务器应用发布生效时间只保证 24 小时内,所以,导致这部分用户在 App Store 下载不了的问题!
这时候,除了让用户等苹果应用生效后在手动下载,还有一个方式,就是让用户取消预订应用!具体可以参考文档 取消应用预订[41],然而,这里需要注意一下,如果游戏是开启了预订奖励,那么让用户取消预订在下载,就可能导致用户的预订奖励无法领取啦!
通过这些细节的探究,App Store 功能之多,每一个小功能,都紧密联系,所以导致系统庞大而臃肿,牵一发而动全身,希望苹果能看到这些问题,做的更加好~
2.8 促销代码(兑换码)
借助在 App Store Connect 中配置的促销代码,让媒体和有影响力的用户率先体验您的 app 或 App 内购买项目。您可以为一款 app 在不同平台的每个版本提供最多 100 个促销代码;每款 App 内购买项目也能提供最多 100 个促销代码。
促销代码概述[42]
促销代码可能大家习惯叫兑换码。促销代码的作用,从苹果的角度来看,是让开发者方便给媒体和有影响力的用户率先体验和评测 app。所以,苹果对促销代码的限制比较多,每个 App 内购买项目提供至多 100 个促销代码,每个 App 的 App 内购买项目代码在每六个月内的总上限均为 1000 个(在1月1日和7月1日重置)。这些代码用于非商业用途,并会在请求代码的 28 天之后过期。
促销代码对于开发者来说,唯一的好处是 app 在 App Store 上架之前使用。也就是说,app 过审后,如果没有发布对外,在 App Store 是无法查看的,但通过促销代码,可以在 App Store 里进行兑换下载。并且对兑成功后,这个 app 可以永久下载,但是,苹果会区分促销代码下载的用户,这部分用户无法对 app 进行评价。点击评分时,会提示“您必须拥有此项目”:
2014 年,Apple 收购了 TestFlight,所以现在苹果主力的测试分发方式改为了 TestFlight。但 TestFlight 也有明显无法满足的需求,因为苹果最终还是想让用户通过 App Store 下载 app。所以 TestFlight 发布的 app 每个版本只有 90 天测试时间,如果开发者在 90 天内没有更新,那么用户就无法从 TestFlight 中下载该应用。而已经下载到设备的 app,也会在下载之日起的第 90 天后失效。在某个版本失效或被开发者主动移除前,用户可以随意在应用的不同版本中切换,用于对比版本间的差异。
然后,目前在国区,促销代码代码也换出很多花样,变成一个第三方分发的方式。
最后,除了以上的促销代码,苹果在 iOS 14 时,推出了 订阅优惠代码[43],优惠代码让您能以优惠价格或限时免费形式来提供订阅,可以帮助您获取、留存和赢回订阅用户。苹果对于内购的营销方式支持力度一直是重点,特殊是游戏类是内购的大头。
使用 iOS 14 和 iPadOS 14 及更高版本的顾客可以通过一个一次性代码兑换 URL 在 App Store 上兑换优惠代码;如果开发者在 app 实现了 presentCodeRedemptionSheet \(英文\)[44] API,用户也可以在 app 内直接兑换。
综上,兑换码本身是可以方便开发者为用户提供测试的机会,随着业务需求的变化,开发者更多的是希望通过兑换码,来吸引用户进行下载 app!毕竟,现在让用户下载一个 app 是非常难的事情。
2.9 App Store 工具
说了这么多,对于苹果和开发者来说,App Store 的利益是共赢(至少是不亏),所以推广开发者的 app,对于苹果或者是开发者来说,都是头等大事。对于大公司来说,会有很多营销或者创意进行推广,但对于一般的开发者来说,特别是独立开发者来说,是一种非常不容易的事。所以,我们一起来看看,苹果为开发者提供了那些推广 app 的工具吧~
App Store Marketing Tools
Market with App Store[45] 是一个非常棒的工具,让开发者快速生成需要的推广素材。生成可打开您 App Store 产品页面的短链接或嵌入式代码,并显示您的 app 图标、二维码或 App Store 徽章。
简单来说,开发者通过 Market with App Store[46] 搜索自己的 app,然后就可以点击打开素材的页面:
Content Link 是 app 的下载链接,App Icon 点击左边的 Copy Embed
是一段 html 的代码,效果是如图一样的一个 icon 的图标,点击图标时会跳转到 app 下载链接。右边是下载当前的 icon 图标(分辨率是1000x1000,自动切成苹果的圆角)。
这个是 App Store 下载的徽章,支持白色和黑色风格,还有“下载”方案是支持多语言定义。
最后是 QR Code 二维码,支持黑色、白色、蓝色三种风格,嵌入 app 图标等。这个功能至少来说还是很方便的~
除了 app 的推广素材,还有 Books、Music、News、Podcasts、TV 等,大家有兴趣的可以自行研究哈,这里就不展开了。
其他图案和指南
为了方便开发者,在网站、电子邮件和社交媒体中展示 app,同时显示 Apple 产品图像和 App Store 徽章等。苹果在 营销资源和识别标志指南[47] 页面里提供了很多素材下载。
App Store 徽章提供了下载和预下载的样式,App Store、Mac App Store、Apple TV 三个平台。对于素材来说,所有本地化语言都包含,下载的每个语言文件夹下有 EPS
和 SVG
二种格式的矢量图片。
苹果非常注重品牌的推广和营销,所以开发者的营销材料中使用 Apple 提供的产品图像,苹果建议始终使用 app 当前开发所针对的最新一代产品图像。在 营销资源和识别标志指南[48] 页面还有非常多的详细规范和准则,感兴趣的朋友可以看看哈~
Apple Design Resources
在苹果 Apple Design Resources[49] 页面,可以下载苹果的标准 UI 素材,包括 Sketch、Photoshop 和 XD 模板等格式,方便开发者快速准确地设计 app 效果图。
RSS Generator
通过这个 RSS Feed 生成工具[50] 页面,可能获取 App Store 榜单的应用排名情况,并且是有 Feed 链接可以获取数据,大家有兴趣可以看看。
2.10 iOS 和 iPadOS 的使用情况
在 App Store \- 支持[51] 页面,苹果提供了最新的 iOS 和 iPadOS 的占比数据:
通过这个数据,可以了解到最新的占比。当然对于不同的地区或者国家,不同的 app,如果要说明产品或者老板 app 不支持 iOS 12 了?可能还是从自家的产品的数据监控为准吧,毕竟苹果这个只是 App Store 的数据,不是苹果的所有设备的系统数据。
2.11 App 侵权争议
开发者开发的 app,可能会面临侵权风险,这个侵权不单单是大家想到的内容抄袭、素材盗用等,比如起的 app 名字,可能别人申请了商标,而你当初起名字时,可能也没有太在意等。随着 App Store 越来越大,其中的利益竟争也必然越来越被重视。开发者在 app 的元数据和内容方面,也需要特别注意。
最后,如果你发现有争议的 app 时,可以通过苹果 Apple \- Legal \- iTunes App Store Content Dispute[52] 页面进行申诉。这个申诉,苹果不会马上对争议的 app 进行处理,而是会给争议双方发送电子邮件,以便双方直接沟通,解决争议。如果你收到苹果的争议邮件,也需要特别注意,及时回复邮件,否则苹果会认为你对争议没有异议,然后将你的 app 下架处理。
2.12 分享您的故事
入选 App Store 精选推荐
App Store 拥有一支全球营销团队,专注于提升 app 的曝光度和用户的参与度。他们会打造各种营销活动和计划,为用户提供帮助、信息和灵感,同时帮助您提升自己 app 和游戏的下载次数与重新下载次数。我们的全球编辑团队根据用户所使用设备的不同,为他们量身打造专属的 App Store app 选购体验,从而在合适的时间和地点,将您的 app 呈现给合适的用户。
最后,我们主要是来说说,假如被苹果推荐后,经常会有同学这样问到,这些素材通过什么方式给苹果呢?格式和标准尺寸是怎么样?
如果 app 被推荐,苹果会在 App Store Connect 开放对应的入口 Promotional Artwork
,因为苹果的推荐位有很多种类型,具体可以查看这个 文件的格式[53] 文档。
特别说一下,苹果推荐目前是没有分级或者分账号显示不同的内容,所有的账号显示的推荐内容是一样的。所以,一般最好是老少皆宜的内容,推广素材需要特别注意,举例来说:
详细可以参考这个 App Store 推广图案准则[54] 文档,苹果列举了非常全面的准则和教程,这里就不展开了。
三、总结
文章有点长了,终于总结了 12 个可能是秘密的秘密?不知道大家有没有认真看完,但希望大家有所收获哈~
最后,从开发者角度来说,每个公司的业务都不一样,大家接触的 App Store “秘密”也不尽相同。所以,小编只是从接触过的视角跟大家一起分享,如果大家有更多“秘密”欢迎与我们一起分享,一起交流,一起进步~
欢迎大家一起在评论区交流~
四、参考
Apple - Support - System Status[55] Choose your country or region - Apple[56] System Status - Apple Developer[57] 如果您无法连接到 App Store、iTunes Store 或其他 Apple 服务 - Apple 支持 \(中国\)[58] Google Workspace 状态信息中心[59] Google Cloud Status Dashboard[60] 查看 Google Workspace 服务的当前状态 - Google Workspace 管理员帮助[61] Firebase Status Dashboard[62] Google Ads 状态信息中心[63] 为您的 App 提供预订 - App Store - Apple Developer[64] 将您的 App 以预订形式发布 - App Store Connect 帮助[65] 在 App Store、iTunes Store 和 Apple Books 中预订应用、影片、音乐和图书 - Apple 支持[66] responseBody.Receipt | Apple Developer Documentation[67] verifyReceipt | Apple Developer Documentation[68] 如何在 Apple 设备上手动更新 App - Apple 支持 \(中国\)[69] App Store 链接更新 - Apple Developer[70] 为应用开放预注册服务以提升用户认知度 - Play 管理中心帮助[71] 太平洋时区 - 维基百科[72] 苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21[73] 解读 AppStore 新功能:自定义产品页面和 A/B Test 工具[74] App Store - 功能 - Apple Developer[75] 评分、评论和回复 - App Store - Apple Developer[76] iTunes - Apple[77] iTunes Search API: Overview[78] iTunes Store API[79] 如何取消 Apple 提供的订阅 - Apple 支持 \(中国\)[80] 从 App Store 下载 App 和游戏 - Apple 支持[81] 如果无法在 iPhone 或其他 Apple 设备上下载或更新 App - Apple 支持[82] 入选 App Store 精选推荐 - App Store - Apple Developer[83] 探索 App Store 和 Mac App Store - App Store - Apple Developer[84] 促销代码概述 - App Store Connect 帮助[85] 为订阅优惠代码做好准备 - 新闻 - Apple Developer[86] 自动续期订阅 - App Store - Apple Developer[87] Market with App Store[88] 营销资源和识别标志指南 - App Store - Apple Developer[89] App Store 推广图案准则[90] App Store - 支持 - Apple Developer[91] Apple - Legal - iTunes App Store Content Dispute[92] Apple Design Resources - Apple Developer[93]
参考资料
https://developer.apple.com/cn/app-store/features/
[2]https://www.apple.com.cn/cn/support/systemstatus/
[3]https://www.apple.com/cn/support/systemstatus/
[4]https://www.apple.com/support/systemstatus/
[5]https://www.apple.com/hk/support/systemstatus/
[6]https://www.apple.com/tw/support/systemstatus/
[7]https://www.apple.com/kr/support/systemstatus/
[8]https://www.apple.com/jp/support/systemstatus/
[9]https://www.apple.com/sg/support/systemstatus/
[10]https://www.apple.com/ru/support/systemstatus/
[11]https://www.apple.com/de/support/systemstatus/
[12]https://www.apple.com/choose-country-region/
[13]https://developer.apple.com/system-status/
[14]https://www.google.com/appsstatus/dashboard/
[15]https://www.google.com/appsstatus/dashboard/summary
[16]https://support.google.com/a/answer/139569?hl=zh-Hans
[17]https://www.google.com/appsstatus/dashboard/
[18]https://status.cloud.google.com/
[19]https://status.firebase.google.com/
[20]https://ads.google.com/status/publisher/
[21]https://downdetector.com/
[22]https://downdetector.com/status/google-play/
[23]https://statusgator.com/services/google-apps
[24]https://support.apple.com/zh-cn/HT201400
[25]https://support.apple.com/zh-cn/HT202039
[26]https://juejin.cn/post/6974733392260644895
[27]https://www.apple.com.cn/itunes/
[28]https://developer.apple.com/cn/news/?id=06142019a
[29]https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/index.html
[30]http://resources.organicfruitapps.com/documentation/itunes-store-web-service-search-api/
[31]https://zh.wikipedia.org/wiki/%E5%A4%AA%E5%B9%B3%E6%B4%8B%E6%97%B6%E5%8C%BA
[32]https://support.apple.com/zh-cn/HT202723
[33]https://support.apple.com/zh-cn/HT202180
[34]https://developer.apple.com/cn/app-store/pre-orders/
[35]https://developer.apple.com/documentation/appstorereceipts/responsebody/receipt
[36]https://developer.apple.com/documentation/appstorereceipts/responsebody/receipt
[37]https://juejin.cn/post/6974733392260644895
[38]https://developer.apple.com/documentation/appstorereceipts/verifyreceipt
[39]https://support.google.com/googleplay/android-developer/answer/9859047?hl=zh-Han
[40]https://help.apple.com/app-store-connect/?lang=zh-cn#/dev44877b669
[41]https://support.apple.com/zh-cn/HT202723
[42]https://help.apple.com/app-store-connect/?lang=zh-cn#/dev50869de4a
[43]https://developer.apple.com/cn/news/?id=lrnyc3aj
[44]https://developer.apple.com/documentation/storekit/skpaymentqueue/3566726-presentcoderedemptionsheet
[45]https://tools.applemediaservices.com/app-store/
[46]https://tools.applemediaservices.com/app-store/
[47]https://developer.apple.com/cn/app-store/marketing/guidelines/#section-products
[48]https://developer.apple.com/cn/app-store/marketing/guidelines/
[49]https://developer.apple.com/design/resources/
[50]https://rss.itunes.apple.com/zh-cn
[51]https://developer.apple.com/cn/support/app-store/
[52]https://www.apple.com/legal/internet-services/itunes/appstorenotices/#/contacts?lang=zh
[53]https://help.apple.com/asc/appspromoart/#/itcff8683d86
[54]https://help.apple.com/asc/appspromoart/?lang=zh-cn/
[55]https://www.apple.com.cn/cn/support/systemstatus/
[56]https://www.apple.com/choose-country-region/
[57]https://developer.apple.com/system-status/
[58]https://support.apple.com/zh-cn/HT201400
[59]https://www.google.com/appsstatus/dashboard/
[60]https://status.cloud.google.com/
[61]https://support.google.com/a/answer/139569?hl=zh-Hans
[62]https://status.firebase.google.com/
[63]https://ads.google.com/status/publisher/
[64]https://developer.apple.com/cn/app-store/pre-orders/
[65]https://help.apple.com/app-store-connect/#/dev44877b669
[66]https://support.apple.com/zh-cn/HT202723
[67]https://developer.apple.com/documentation/appstorereceipts/responsebody/receipt
[68]https://developer.apple.com/documentation/appstorereceipts/verifyreceipt
[69]https://support.apple.com/zh-cn/HT202180
[70]https://developer.apple.com/cn/news/?id=06142019a
[71]https://support.google.com/googleplay/android-developer/answer/9859047?hl=zh-Hans
[72]https://zh.wikipedia.org/wiki/%E5%A4%AA%E5%B9%B3%E6%B4%8B%E6%97%B6%E5%8C%BA
[73]https://juejin.cn/post/6974733392260644895
[74]https://juejin.cn/post/6986478834040209445
[75]https://developer.apple.com/cn/app-store/features/
[76]https://developer.apple.com/cn/app-store/ratings-and-reviews/
[77]https://www.apple.com.cn/itunes/
[78]https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/index.html
[79]http://resources.organicfruitapps.com/documentation/itunes-store-web-service-search-api/
[80]https://support.apple.com/zh-cn/HT202039
[81]https://support.apple.com/zh-cn/HT204266
[82]https://support.apple.com/zh-cn/HT207165
[83]https://developer.apple.com/cn/app-store/getting-featured/
[84]https://developer.apple.com/cn/app-store/discoverability/
[85]https://help.apple.com/app-store-connect/?lang=zh-cn#/dev50869de4a
[86]https://developer.apple.com/cn/news/?id=lrnyc3aj
[87]https://developer.apple.com/cn/app-store/subscriptions/#offer-codes
[88]https://tools.applemediaservices.com/app-store/
[89]https://developer.apple.com/cn/app-store/marketing/guidelines/#section-products
[90]https://help.apple.com/asc/appspromoart/#/
[91]https://developer.apple.com/cn/support/app-store/
[92]https://www.apple.com/legal/internet-services/itunes/appstorenotices/#/contacts?lang=zh
[93]https://developer.apple.com/design/resources/
转自:掘金 37手游iOS技术运营团队
https://juejin.cn/post/6992134804997160996#heading-13
- EOF -
看完本文有收获?请分享给更多人
关注「 iOS大全 」加星标,关注 iOS 动态
点赞和在看就是最大的支持❤️